package core.logic.dataAccess;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import javax.swing.JOptionPane;

import core.logic.services.utilServices.ConnectionService;
import core.models.dataModels.searchModels.ZoekPassagierModel;
import core.models.domainModel.Adres;
import core.models.domainModel.Passagier;
import core.models.domainModel.Persoon;
import core.models.domainModel.Vlucht;
import core.models.domainModel.Zitplaats;


/**
 * @author Lieven Vandeperre(c1025684): Deze File in comment gezet, aangezien het builderrors gaf
 * graag eerst builden en runnen alvores source files to commiten
 *
 */
public class PassagierDAO {
	//deze methode gaat enkel op zoek naar de basisobjecten en vervolledigt zijn innerlijke entiteiten niet (in dit geval wordt adres niet opgehaald
//			public static ArrayList<Luchthaven> getAllBasic(){
//				String sql = "SELECT * FROM Passagier";
//				
//				try{
//				Statement statement = ConnectionService.getConnection().createStatement();
//				ResultSet rs = statement.executeQuery(sql);
//				
//				while(rs.next()){
//					Eticketnr = rs.getString(arg0)
//				}
//				
//				}
//				catch(SQLException ex){
//					
//				}
//				return lijst;
//			}
//	
	
	
	/**
	 * @author Y. Laenen[C1011950]: Invullen van passagier op DB, nodig bij booking
	 * Geen betalingsgegevens, geen zitplaatsgegevens
	 * 
	 */
	public static int AddPassagier(Passagier passagier){
		String sql = "INSERT INTO Passagier(PersoonId, VluchtId, BookingType, PaspoortNummer) " +
					 "VALUES (?, ?, ?, ?)";
		int ok = 0;
	
		try{
			
			Connection con = ConnectionService.getConnection();
			PreparedStatement pst = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
			pst.setInt(1, passagier.getPersoon().getPersoonId());
			pst.setInt(2, passagier.getVlucht().getVluchtId());
			pst.setString(3, passagier.getBookingType());
			pst.setString(4, passagier.getPaspoortNr());
			
			ok = pst.executeUpdate();
			
			ResultSet rs = pst.getGeneratedKeys(); //ophalen van de gegenereerde id
			rs.next();
			passagier.setPassagierId(rs.getInt(1));
		}
		catch(SQLException ex){
			
		}
		return ok;
	}
	
	// Joeri De Smet C1022784
	public static ArrayList<Passagier> GetPassagierByVluchtID(int VluchtID){
		ArrayList<Passagier> Passagierlijst = new ArrayList<Passagier>();
		
		String sql = "SELECT * FROM Passagier, Persoon Where Passagier.PersoonId = Persoon.PersoonId AND  VluchtId = ?";
		try
		{
			PreparedStatement prep= ConnectionService.getConnection().prepareStatement(sql);
			prep.setInt(1, VluchtID);
			
			ResultSet rs = prep.executeQuery();
			
			while(rs.next()){
				Persoon per = new Persoon();
				per.setNaam(rs.getString("Naam"));
				per.setVoornaam(rs.getString("Voornaam"));
				per.setGeboortedatum(rs.getString("Geboortedatum"));
				
				Passagier pas = new Passagier(  rs.getInt("PassagierId"),
												per,
												null,
												null,
												rs.getString("PaspoortNummer"),
												rs.getString("KaartNummer"),
												null,
												0,
												null,
												null);
				
				Passagierlijst.add(pas);
			 
						
			}
					
		}
		catch(SQLException ex){
			ex.printStackTrace();
		}
		return Passagierlijst;
		
	}
		
	
	
	// Jente Bosmans c1024555
	public static ArrayList<Passagier> zoekPassagier(ZoekPassagierModel model) {
		ArrayList<Passagier> lijst = new ArrayList<Passagier>();
		
		String sql = "SELECT Passagier.PassagierId, Persoon.Voornaam, Persoon.Naam, " 
					+ " Vlucht.VluchtNr"
					+ " FROM  Persoon, Passagier, Vlucht "
					+ " WHERE Persoon.PersoonId = Passagier.PersoonId"
					+ " AND Passagier.VluchtId = Vlucht.VluchtId";
		
		if (model.getPassagierId()!= null && model.getPassagierId() > 0) {
			sql += " AND Passagier.PassagierId = ?";
		}
		if (model.getVoornaam() != null && model.getVoornaam().length() > 0) {
			sql += " AND ";
			sql += "Persoon.Voornaam LIKE '%'+?+'%'";
		}
		if (model.getFamilienaam() != null && model.getFamilienaam().length() > 0) {
			sql += " AND ";
			sql += "Persoon.Naam LIKE '%'+?+'%'";
		}
		if (model.getVlucht() != null && model.getVlucht()!= "") {
			sql += " AND ";
			sql += "Vlucht.VluchtNr = ?";
		}	
		
		
		try {
			int i = 0;
			PreparedStatement pst = ConnectionService.getConnection().prepareStatement(sql);
			if(model.getPassagierId() != null && model.getPassagierId() > 0) {
				pst.setInt(i+1, model.getPassagierId());
				i++;
				}
			if (model.getVoornaam() != null && model.getVoornaam().length() > 0) {
				pst.setString(i+1, model.getVoornaam()); 
				i++;
				}
			if (model.getFamilienaam() != null && model.getFamilienaam().length() > 0) {
				pst.setString(i+1, model.getFamilienaam()); 
				i++;
				}
			if (model.getVlucht()!= null && model.getVlucht() != "" ) {
				pst.setString(i+1, model.getVlucht());
				i++;
				}
			
			ResultSet rs = pst.executeQuery();
			while(rs.next()){
				Persoon pers = new Persoon();
				Vlucht vlu = new Vlucht();
				
				pers.setNaam(rs.getString("Naam"));
				pers.setVoornaam(rs.getString("Voornaam"));
				vlu.setVluchtNr(rs.getString("VluchtNr"));
				
				lijst.add(new Passagier(rs.getInt("PassagierId"),pers,vlu));
				
				
			}
			return lijst;
			
		} 
		catch (Exception ex) {
			ex.printStackTrace();
		}

		return lijst;
		}
	
	
	public static void deletePassagier(Integer passagierId){
		String sql = "DELETE FROM Passagier WHERE PassagierId = ?";
		
		try{
			PreparedStatement pst = ConnectionService.getConnection().prepareStatement(sql);
			pst.setInt(1, passagierId);
			pst.execute();
		}
		catch(SQLException ex){
			ex.printStackTrace();
		}
		
	}
	
	//Lieven Drijkoningen
	//Ophalen van persoonId op basis van paspoortnr
	public static Passagier getPersoonByPaspoortNr(Passagier p)
	{
		String sql = "SELECT PersoonId FROM Passagier WHERE PaspoortNummer = ?";		
		
		try
		{
			PreparedStatement pst = ConnectionService.getConnection().prepareStatement(sql);
			pst.setString(1, p.getPaspoortNr());
			ResultSet rs = pst.executeQuery();
			while(rs.next())
			{
				p.getPersoon().setPersoonId(rs.getInt("PersoonId"));
			}			
		
		}
		catch (SQLException sqlex)
		{
			JOptionPane.showMessageDialog(null, sqlex.getMessage());
		}
		return p;
	}
	
	//Lieven Drijkoningen
	//Ophalen van arraylist met PassagiersId op basis van PaspoortNummer
	public static ArrayList<Integer> getBoekingen(String id)
	{
		String sql = "SELECT PassagierId FROM Passagier WHERE PaspoortNummer = ?";
		ArrayList<Integer> l = new ArrayList<Integer>();
		try
		{
			PreparedStatement pst = ConnectionService.getConnection().prepareStatement(sql);
			pst.setString(1,id);
			ResultSet rs = pst.executeQuery();
			while(rs.next())
			{
				l.add(rs.getInt("PassagierId"));
			}
		}
		catch(SQLException ex)
		{
			ex.printStackTrace();
		}
		return l;
	}
	
	public static int updatePassagierSecurity(Integer i)
	{
		String sql = "UPDATE Passagier "
				+ "SET PassagierStatus = 'SEC' "
				+ "WHERE PassagierId = ?";
		int res = 0;
		try
		{
			PreparedStatement pst = ConnectionService.getConnection().prepareStatement(sql);
			pst.setInt(1, i);
			res = pst.executeUpdate();
		}
		catch(SQLException ex)
		{
			JOptionPane.showMessageDialog(null, ex.getMessage());
		}
		return res;
		
	}
	
	
	
	//Y. Laenen  11/12/13
	//passagier wijzigen
	
	public static int updatePassagier(Passagier passagier)
	{
		String sql = "UPDATE Passagier "
				+ "SET Paspoortnummer = ?, "
				+ "KaartNummer = ?, "
				+ "KaartType= ?, "
				+ "Controlecijfer= ?, "
				+ "Vervaldag= ? "
				+ "WHERE PassagierId = ?";
		int res = 0;
		try
		{
			PreparedStatement pst = ConnectionService.getConnection().prepareStatement(sql);
			pst.setString(1, passagier.getPaspoortNr());
			pst.setString(2, passagier.getKaartnummer());
			pst.setString(3, passagier.getKaartType());
			pst.setInt(4, passagier.getControleCijfer());
			pst.setString(5, passagier.getVervaldatumKaart());
			pst.setInt(6, passagier.getPassagierId());
			res = pst.executeUpdate();
		}
		catch(SQLException ex)
		{
			JOptionPane.showMessageDialog(null, ex.getMessage());
		}
		return res;
		
	}
	// Y.Laenen
	//volledige passagier ophalen op basis van passagiersID
	//ik verbreek wel wat regels door andere DAO's aan te roepen maar anders wordt het te omslachtig ..
	
	public static Passagier getPassagierById(int passaId)
	{
		Passagier p = null;
		String sql = "SELECT * FROM Passagier WHERE PassagierId = ?";		
		
		try
		{
			PreparedStatement pst = ConnectionService.getConnection().prepareStatement(sql);
			pst.setInt(1, passaId);
			ResultSet rs = pst.executeQuery();

			while (rs.next())
			{
			Vlucht b = VluchtenDAO.getVluchtByVluchtId(rs.getInt("VluchtId"));
			Persoon a = PersoonDAO.getPersoonById(rs.getInt("PersoonId"));
			Adres ad = AdresDAO.getAdresByAdresId(a.getAdres().get_adresId());
			a.setAdres(ad);
			Zitplaats c = ZitplaatsDAO.getZitplaatsById(rs.getInt("ZitplaatsId"));
			
			
			p = new Passagier(a, b, rs.getString("BookingType"), rs.getString("Paspoortnummer"), rs.getString("Kaartnummer"), rs.getString("Kaarttype"), rs.getInt("Controlecijfer"), rs.getString("Vervaldag"), c);
			p.setPassagierId(passaId);
			}
		
		}
		catch (SQLException sqlex)
		{
			JOptionPane.showMessageDialog(null, sqlex.getMessage());
		}
		return p;
	}
	
	
	
	
	// Gerrit Beyens
	public static int updatePassagierZitplaatsByPassagier(Passagier passagier) {
		String sql = "UPDATE Passagier " + "SET zitplaatsId =? "
				+ " WHERE PassagierId = ?";
		int res = 0;
		try {
			PreparedStatement pst = ConnectionService.getConnection()
					.prepareStatement(sql);
			pst.setInt(1, passagier.getZitplaats().getZitplaatsId());
			pst.setInt(2, passagier.getPassagierId());
			res = pst.executeUpdate();
		} catch (SQLException ex) {
			JOptionPane.showMessageDialog(null, ex.getMessage());

		}
		return res;
	}

}

